﻿using System;
using System.Linq;
using System.ComponentModel.DataAnnotations;

namespace Retete.Models
{
    [MetadataType(typeof(ReceptieValidation))]
    public partial class Receptie
    {
        public decimal Valoare
        {
            get { return Produse.Sum(element => element.Valoare); }
        }

        public class ReceptieValidation
        {
            [Required(ErrorMessage="Numarul receptiei este obligatoriu")]
            public int Numar { get; set; }

            [Required(ErrorMessage = "Data este obligatorie")]
            public DateTime Data { get; set; }

            [Required(ErrorMessage = "Valoarea TVA este obligatorie")]
            public decimal Tva { get; set; }
        }
    }

    public partial class ReceptieProdus
    {
        public decimal Valoare
        {
            get { return Cantitate * PretCumparare; }
        }
        public decimal PretCumparareCuTVA
        {
            get { return PretCumparare * (1 + Receptie.Tva); }
            set { PretCumparare = value / (1 + Receptie.Tva); }
        }
        public decimal ValoareCuTVA
        {
            get 
            {
                if (AdmiteTVA == true) return Valoare + ValoareTVA;
                else return Valoare;
            }
        }
        public decimal ValoareTVA
        {
            get 
            {
                if (AdmiteTVA == true) return Valoare * Receptie.Tva;
                else return 0;
            }
        }
        public decimal ProcentAdaosComercial
        {
            get 
            {
                if (PretCumparareCuTVA > 0) return PretVanzare / PretCumparareCuTVA;
                else return 0;
            }
        }
    }

    [MetadataType(typeof(MeniuValidation))]
    public partial class Meniu
    {
        public class MeniuValidation
        {
            [Required(ErrorMessage = "Denumirea meniului este obligatorie")]
            public string Denumire { get; set; }

            [Required(ErrorMessage = "Pretul meniului este obligatoriu")]
            public decimal Pret { get; set; }

            public DateTime Valabilitate { get; set; }
        }
    }

    public partial class MeniuReteta
    {
        public class MeniuRetetaValidation
        {
            [DisplayFormat(DataFormatString = "{0:0.00}")]
            public decimal Pret { get; set; }
        }
    }

    public partial class ElementVanzare
    {
        public decimal Valoare
        {
            get { return Pret * Portii; }
        }
        public string DenumireUnica
        {
            get
            {
                if (IDReteta.HasValue == true && Reteta != null) return Reteta.Nume;
                else if (IDMeniu.HasValue == true && Meniu != null) return Meniu.Denumire;
                else if (IDProdus.HasValue == true && Produs != null) return Produs.Nume;
                else return null;
            }
        }
        public string CodUnic
        {
            get
            {
                if (IDReteta.HasValue == true && Reteta != null) return Reteta.Cod;
                else if (IDMeniu.HasValue == true && Meniu != null) return Meniu.Cod;
                else if (IDProdus.HasValue == true && Produs != null) return Produs.Cod;
                else return null;
            }
        }
    }

    public partial class RetetaProdus
    {
        public decimal ValoareCumparare
        {
            get { return Cantitate * Produs.PretCumparare; }
        }
        public decimal CostCumpararePortie
        {
            get 
            {
                if (Reteta != null) return ValoareCumparare / Reteta.MultiplicatorCantitati;
                else return (decimal)0.00;
            }
        }

        public decimal ValoareCumparareCuTVA
        {
            get { return ValoareCumparare * (decimal)1.24; }
        }
        public decimal CostCumpararePortieCuTVA
        {
            get { return CostCumpararePortie * (decimal)1.24; }
        }
    }

    public partial class Vanzare
    {
        public decimal Valoare
        {
            get { return ElementeVanzare.Sum(element => element.Valoare); }
        }
    }

    public partial class VanzareBon
    {
        public decimal Valoare
        {
            get { return ValoareBon * NumarBonuri; }
        }
    }
}